LogoUniud
In questo notebook si andrà ad analizzare il dataset “Spotify Dataset 1921-2020, 160k+ Tracks”, per cercare di ottenere una panoramica dei brani presenti su Spotify, analizzandone i trend e le caratteristiche.
Definizione delle features
Prima analisi sulle features
library(tidyverse)
## ── Attaching packages ──────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.0 ✓ purrr 0.3.3
## ✓ tibble 2.1.3 ✓ dplyr 1.0.5
## ✓ tidyr 1.0.2 ✓ stringr 1.4.0
## ✓ readr 1.3.1 ✓ forcats 0.5.1
## ── Conflicts ─────────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(dplyr)
library(tidyr)
library(ggplot2)
spotify_db <- read.csv("./completeSpotifyDb.csv")
In primo luogo, viene effettuata una analisi “di primo livello” delle features a livello macroscopico. Partiamo con il numero di brani pubblicati nel tempo.
ggplot(data = count(spotify_db, year)) + geom_col(aes(x = year, y = n)) + labs(title = "Numero di brani pubblicati nel tempo", subtitle = "Statico dagli anni '40, in incremento dal 2000", x ="Anno di pubblicazione", y = "Numero di brani") + theme_minimal()
Fino agli anni ’50 si può notare come siano stati pubblicati meno brani rispetto al futuro, probabilmente per via della minor accessibilità di studi e strumenti di registrazione al grande pubblico. Interessante notare come poi il trend non prosegua linearmente, ma si abbassi per poi aumentare con un enorme picco di oltre 4000 brani pubblicati nel 2020. Questo picco può essere legato all’anno della pandemia?
Procediamo ora con l’analisi della durata media (in secondi) dei brani negli anni, cercando anche di osservare se c’è un trend di crescita o decrescita.
mean_dur_by_year <- aggregate((spotify_db$duration_ms)/1000, list(spotify_db$year), mean)
colnames(mean_dur_by_year) <- c("Year","Avg_track_duration")
mean_dur_by_year %>%
ggplot(aes(x = Year, y = Avg_track_duration)) + geom_point() + geom_smooth() + labs(title = "Durata media dei brani nel tempo", subtitle = "In aumento fino agli anni '90 e poi in decrescita ", x ="Anno in analisi", y = "Durata media dei brani (in secondi)") + theme_minimal()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Come si può notare, c’è un trend complessivo di aumento della durata, che però negli ultimi anni non è stato così marcato, anzi. Se ad esempio restringiamo il campo d’azione, analizzando i brani pubblicati dopo il 2005, potremmo quasi notare un trend inverso
filter(mean_dur_by_year, Year > 2005) %>%
ggplot(aes(x = Year, y = Avg_track_duration)) + geom_point() + geom_smooth() + labs(title = "Durata media dei brani nel tempo", subtitle = "Focus sull'inversione di tendenza iniziata dal 2011", x ="Anno in analisi", y = "Durata media dei brani (in secondi)") + theme_minimal()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Quindi, seppure negli ultimi due anni il trend sia in risalita, si è comunque verificata una recente inversione.
Abbiamo osservato qualche trend macroscopico, ma è interessante ora cercare di capire quanto le varie caratteristiche dei brani siano collegate. Per fare ciò viene utilizzato lo strumento statistico del coefficiente di correlazione di Pearson, che indica la dipendenza lineare che sussiste tra due variabili. Per rappresentare ciò è interessante utilizzare una Heatmap.
È opportuno filtrare le features, per escludere quelle non legate alla natura musicale del brano.
spotify_db_filtered <- spotify_db %>%
select(-year,-explicit, -artists, -id, -name, -release_date)
corrMatrix <- round(cor(spotify_db_filtered, method = "pearson"), 3)
library(heatmaply)
## Loading required package: plotly
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
## Loading required package: viridis
## Loading required package: viridisLite
##
## ======================
## Welcome to heatmaply version 1.2.1
##
## Type citation('heatmaply') for how to cite the package.
## Type ?heatmaply for the main documentation.
##
## The github page is: https://github.com/talgalili/heatmaply/
## Please submit your suggestions and bug-reports at: https://github.com/talgalili/heatmaply/issues
## Or contact: <tal.galili@gmail.com>
## ======================
heatmaply(corrMatrix)
## Warning in doTryCatch(return(expr), name, parentenv, handler): unable to load shared object '/Library/Frameworks/R.framework/Resources/modules//R_X11.so':
## dlopen(/Library/Frameworks/R.framework/Resources/modules//R_X11.so, 6): Library not loaded: /opt/X11/lib/libSM.6.dylib
## Referenced from: /Library/Frameworks/R.framework/Versions/3.6/Resources/modules/R_X11.so
## Reason: image not found
Dall’analisi della correlazione, notiamo due interessanti legami
Osserviamo graficamente questi fenomeni
spotify_db %>%
ggplot(aes(x=energy, y=loudness)) + geom_point() + geom_smooth(method = "lm") + labs(title = "Analisi di correlazione tra energia e volume dei brani", subtitle = paste("La linea di tendenza crescente testimonia la correlazione diretta, coefficiente: ", round(cor(spotify_db$energy, spotify_db$loudness, method = "pearson"), digits = 3)), x ="Energia", y = "Volume") + theme_minimal()
## `geom_smooth()` using formula 'y ~ x'
spotify_db %>%
ggplot(aes(x=valence, y=danceability)) + geom_point() + geom_smooth(method = "lm") + labs(title = "Analisi di correlazione tra valenza e danzabilità e volume dei brani", subtitle = paste("Correlazione verificata, coefficiente: ", round(cor(spotify_db$valence, spotify_db$danceability, method = "pearson"), digits = 3)), x ="Energia", y = "Volume") + theme_minimal()
## `geom_smooth()` using formula 'y ~ x'
spotify_db %>%
ggplot(aes(x=energy, y=acousticness)) + geom_point() + geom_smooth(method = "lm") + labs(title = "Analisi di correlazione tra energia e acusticità dei brani", subtitle = paste("La linea di tendenza decrescente testimonia la correlazione inversa, coefficiente: ", round(cor(spotify_db$energy, spotify_db$acousticness, method = "pearson"), digits = 3)), x ="Energia", y = "Acusticità") + theme_minimal()
## `geom_smooth()` using formula 'y ~ x'
spotify_db %>%
ggplot(aes(x=acousticness, y=loudness)) + geom_point() + geom_smooth(method = "lm") + labs(title = "Analisi di correlazione tra acusticità e volume dei brani", subtitle = paste("Inversione meno marcata rispetto al caso precedente, coefficiente: ", round(cor(spotify_db$acousticness, spotify_db$loudness, method = "pearson"), digits = 3)), x = "Acusticità", y ="Volume") + theme_minimal()
## `geom_smooth()` using formula 'y ~ x'
Queste due analisi grafiche confermano quanto ricavato dalla heatmap precedente.
Dal punto di vista musicale, è anche molto interessante effettuare un’analisi macroscopica delle tonalità e dei modi prevalentemente utilizzati nel brani. In breve, la tonalità indica l’accordo dominante nel brano e il modo indica se è maggiore (felice) o minore (triste). Nel dataset le tonalità sono indicate con numeri da 0 (Do) a 11 (Si). È opportuno tradurre questi numeri in note. Allo stesso modo, il modo è indicato con 0 per minore e 1 per maggiore.
nomi_note <- c("Do","Do#","Re","Re#","Mi","Fa","Fa#","Sol","Sol#","La","La#","Si")
tracks_by_key <- spotify_db %>%
count(key, sort=TRUE) %>%
mutate(chiave = nomi_note[key+1]) %>%
select(chiave, n)
tracks_by_key %>%
ggplot(aes(x=reorder(chiave, -n), y=n)) + geom_bar(stat="identity") + labs(title = "Confronto tra le tonalità più utilizzate", subtitle = "Vincono quelle con meno alterazioni in chiave", x = "Tonalità", y = "Numero di brani") + theme_minimal()
nomi_modi <- c("Minore","Maggiore")
tracks_by_mode <- spotify_db %>%
count(mode, sort=TRUE) %>%
mutate(modo = nomi_modi[mode+1]) %>%
select(modo, n)
ggplot(tracks_by_mode, aes(x = modo, y = n)) + geom_col() + labs(title = "Confronto tra i modi", subtitle = "Il modo maggiore è quello più utilizzato", x = "Modo", y = "Numero di brani") + theme_minimal()
Come era lecito aspettarsi, le tonalità dominanti sono Do, Sol, Re, La e Fa, e il modo è quello Maggiore. Musicalmente, queste tonalità sono le più utilizzate per via di regole musicali per la scrittura dei brani, infatti sono le tonalità con meno alterazioni (diesis e bemolli), quindi più facili da scrivere e immediate da ascoltare. Inoltre, il modo maggiore risulta ampiamente più utilizzato del minore, proprio per la sua natura gioiosa.
Per concludere questo capitoletto, è interessante analizzare la popolarità dei brani.
most_popular_by_year = tibble(artists=NA,name=NA, year=NA, popularity=NA)
for (i in 1920:2021) {
dt <- spotify_db %>%
filter(year == i) %>%
select(artists, name, year, popularity) %>%
arrange(-popularity) %>%
head(1)
most_popular_by_year <- rbind(most_popular_by_year, dt)
}
most_popular_by_year %>%
ggplot(aes(x=year, y=popularity)) + geom_col() + labs(title = "Andamento dei brani più popolari nel tempo", subtitle = "Cresce nel tempo, tuttavia i brani dagli anni '60 restano molto popolari", x = "Anno", y = "Popolarità del brano più popolare") + geom_smooth() + theme_minimal()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning: Removed 1 rows containing non-finite values (stat_smooth).
## Warning: Removed 1 rows containing missing values (position_stack).
Tramite questo grafico si può affermare che non conviene pubblicare brani ispirati alla musica relativa agli anni ’30, ’40 e ’50, in quanto non è affatto popolare. Chiaramente i brani più recenti sono quelli attualmente più popolari, ma anche i brani degli anni ’60 - ’90 restano molto popolari.
Per effettuare una breve analisi degli artisti, iniziamo elencando gli artisti più produttivi. I featuring vengono considerati come un artista singolo.
spotify_db %>%
count(artists) %>%
arrange(-n) %>%
rename(
Artista = artists,
Brani = n
)
Inaspettatamente, il podio non è composto da musicisti! Il primo è stato uno scrittore polacco, il secondo (Hemingway) è stato uno scrittore americano e il terzo (Remarque) è stato uno scrittore tedesco. Questo testimonia la potenza della piattaforma Spotify, che viene utilizzata non solo per musica, ma sempre di più anche per pubblicare podcast o narrazioni.
rb <- strsplit(gsub('^.|.$', '', most_popular_by_year$artists), "'")
df <- data.frame(matrix(unlist(rb), nrow=249, byrow=TRUE),stringsAsFactors=FALSE)
df %>%
count(matrix.unlist.rb...nrow...249..byrow...TRUE.) %>%
filter(n<20) %>%
arrange(-n) %>%
rename(
Artista = matrix.unlist.rb...nrow...249..byrow...TRUE.,
Conteggio = n
)
Gli AC/DC troneggiano, autori del brano più popolare per ben 3 anni. Dopo di loro, troviamo altri artisti del calibro di Elton John, Elvis Presley e Fred Astaire.
Iniziamo ora l’esplorazione dei generi musicali. Il dataset mette a disposizione un ulteriore file .csv, dove vengono riportate le informazioni relative ad artisti e generi. Vediamoli, elencati in base al numero di brani associati ad ogni genere.
spotify_genres <- read.csv("./data_by_genres.csv")
spotify_genres %>%
select(genres, popularity) %>%
arrange(-popularity) %>%
rename(
Genere = genres,
Popolarità = popularity
) %>%
head(10)
Risultati interessanti, visto che di questi generi, almeno la metà sono completamente sconosciuti per me.
Può ora risultare interessante analizzare l’evoluzione